import type { Router, RouteRecordRaw } from "vue-router";
import { createWebHistory, createRouter } from "vue-router";
import {constantRoutesFilter, initRouter, dynamicRouteTag, handleAliveRoute} from "./utils";
import NProgress from "@/utils/progress";
import { openLink } from "@/utils/link";
import { split, cloneDeep } from "lodash-es";
import { getToken } from "@/utils/auth";
import store from "@/store";
// 静态白名单路由
import remainingRouter from "./remaining";
// 自动导入modules文件夹下的所有路由模块
const modules = import.meta.glob("./modules/*.ts", { eager: true }) as Record<string, { default: RouteRecordRaw[] }>;
// 原始静态路由（未做任何处理）
const routes: RouteRecordRaw[] = [];
for(const path in modules){
	const itemModule = modules[path];
  // 模块化路由是数组形式数据
  itemModule.default.forEach(function(item: RouteRecordRaw){
    routes.push(item);
  });
  // 模块化路由是对象形式数据
	//routes.push(itemModule.default);
}
// 获取处理后的静态路由（未获取动态路由的情况下，属于动态路由子集的路由需要先剔除掉，只实例化静态就能展示的路由）
const constantRootRoutes = constantRoutesFilter(cloneDeep(routes),false,false);
const constantNotRootRoutes = constantRoutesFilter(cloneDeep(routes),true,false);

// 创建路由实例
export const router: Router = createRouter({
  history: createWebHistory(),
  routes: constantRootRoutes.concat(...remainingRouter)
});

// 导出静态路由作为菜单数据使用
export const constantRouteMenus = constantRoutesFilter(cloneDeep(routes),false,true).concat(...remainingRouter);

// 路由白名单
const whiteList = ["/login"];
router.beforeEach((to, _from, next) => {
  if (to.meta?.keepAlive) {
    const newMatched = to.matched;
    handleAliveRoute(newMatched, "add");
    // 页面整体刷新和点击标签页刷新
    if (_from.name === undefined || _from.name === "redirect") {
      handleAliveRoute(newMatched);
    }
  }
  const token = getToken();
  NProgress.start();
  const externalLink = to?.redirectedFrom?.fullPath;
  if (token) {
    if(_from?.name==="Login"||!_from?.name){
      // 如果是从登录页过来的，或者name不存在（说明是浏览器刷新事件），则需要请求路由数据，再执行下一步
      if (store.state.routeMenus.routeMenus.length === 0){
        initRouter(constantNotRootRoutes).then(() => {
          router.push(to.path);
          dynamicRouteTag(to);
        });
      }
      next();
    }else{
      // 如果是其他页面跳转的，且其他页面的name存在，则再判断当前跳转页是否是外链页面
      if(externalLink&&externalLink.includes("http")){
        openLink(`http${split(externalLink, "http")[1]}`);
        NProgress.done();
      }else{
        dynamicRouteTag(to);
        next();
      }
    }
  } else { // 未登录
    // 当前访问页面不是登陆页面
    if (to.path !== "/login") {
      // 当前访问页面包含在路由白名单中，可直接跳转
      if (whiteList.includes(to.path)) {
        next();
      } else {
        // 当前访问页面需要登录才能访问，需先跳转到登陆页，并将当前访问路由通过链接保存，在登陆后，获取该路由进行跳转
        next(`/Login?redirect=${to.path}`);
      }
    } else {
      // 当前访问页面本身就是登录页，直接跳转
      next();
    }
  }
});

router.afterEach(() => {
  NProgress.done();
});
export default router;